// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.mall.logic.shop;

import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;

import com.eva.android.HttpServiceFactory4A;
import com.eva.framework.dto.DataFromClient;
import com.eva.framework.dto.DataFromServer;
import com.eva.framework.dto.SysActionConst;
import com.x52im.mall.MallGlobal;
import com.x52im.mall.dto.CommonProcessorConst;
import com.x52im.mall.shop.dto.Device;

import java.util.ArrayList;

/**
 * 商品信息数据提示供类.
 * 
 * <p>
 * 因目前商品很少，为了提升性能，考虑商城启动后只从服务端加载一次数据，
 * 以后在非手动刷新情况就只用使用缓存即可.
 * 
 * <p>
 * <b>注意：</b>请确保在使用本类的商品列表数据前已经从服务端加载了这些数据。也就是本类中的商
 * 品列表数据当且仅当{@link hasInit}==true时才表示已经从服务端成功加载过，否则该列表将一直是空的
 * 直到被初始化（从服务端加载数据）完成.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class GoodsProvider
{
	private final static String TAG = GoodsProvider.class.getSimpleName();
	
	/** 
	 * 商品列表是否已经初化过.
	 * <p>
	 * true表示已经初始化过，否则没有初始化过。初始化过意味着商品列表已经缓存过了，通常情况下
	 * 没有必要再去服务端加载了，除非是真的需要，那么就可使用程序的强度刷新商品列表功能即可。
	 *  */
	private boolean hasInit = false;
	
	/** 注意：本对象当且仅当调用 {@link #resetDatas(ArrayList)}后被建立 */
	private ArrayList<Device> goodsData = new ArrayList<Device>();
	
	public GoodsProvider()
	{
		//
	}
	
	/**
	 * 根据商品ID找到它在列表中暂存的详细信息.
	 * 
	 * @param device
	 * @return 如果存在则返回指定商品的信息封装对象，否则返回null
	 */
	public Device getDeviceById(String device_id)
	{
		if(goodsData != null)
		{
			for(Device ree : goodsData)
			{
				if(ree.getDevice_id().equals(device_id))
					return ree;
			}
		}
		
		return null;
	}
	
	/**
	 * 返回商品列表数据集合.
	 * 
	 * @return
	 */
	public ArrayList<Device> getRosterData()
	{
		return goodsData;
	}

	/**
	 * 重置列表数据.
	 * 
	 * @param deviceDatas
	 */
	private void resetDatas(ArrayList<Device> deviceDatas)
	{
		goodsData.clear();
		if(deviceDatas != null)
		{
			// 设置是否初始化的标识常量为true
			hasInit = true;
			
			for(Device d : deviceDatas)
				goodsData.add(d);
		}
	}

	/**
	 * 取商品列表实施方法.
	 * 
	 * @param context
	 * @return
	 */
	private DataFromServer getDevicesImpl(Activity activity)
	{
		return MallGlobal.getMallProviderInstance(activity).getRobotimeMall().getNoNeedAuthedService().sendObjToServer(
				DataFromClient.n()
				.setProcessorId(CommonProcessorConst.PROCESSOR_SHOP_NO$NEED$AUTHED)
				.setJobDispatchId(com.x52im.mall.shop.dto.JobDispatchConst.SHOP_GOODS_MGR_NO$NEED$AUTHED)
				.setActionId(SysActionConst.ACTION_QUERY)
		);
	}
	
	/**
	 * 刷新商品列表.
	 * 
	 * @return true表示刷新成功，否则表示不成功
	 */
	public boolean refreshRoster(Activity activity)
	{
		DataFromServer dfs = getDevicesImpl(activity);
		boolean sucess = false;
		if(sucess = (dfs != null && dfs.isSuccess()))
			resetDatas((ArrayList<Device>)dfs.getReturnValue());
		return sucess;
	}

	public boolean isHasInit()
	{
		return hasInit;
	}
	
	//--------------------------------------------------------------------------------------------------
	/**
	 * 查询商品列表数据的异步多线程封装类.
	 */
	public static abstract class DataRefreshAsyncTask extends AsyncTask<Object, Integer, DataFromServer>
	{
		private Activity activity = null;
		private GoodsProvider goodsProvider = null;
		
		public DataRefreshAsyncTask(Activity activity, GoodsProvider goodsProvider)
		{
			this.activity = activity;
			this.goodsProvider = goodsProvider;
		}
		
		/**
		 * 处理耗时数据前先显示进度条.
		 */
		@Override
		protected void onPreExecute()
		{
			_showProgessBar();
		}
		
		/**
		 * 在后台执行查询功能列表描述数据（不包括今日天气信息）.
		 * 
		 * @param parems 参数没有意义
		 * @return 查询结果，将传递给onPostExecute(..)方法
		 */
		@Override
		protected DataFromServer doInBackground(Object... parems) 
		{
			return goodsProvider.getDevicesImpl(activity);
		}
		
		/**
		 * <p>
		 * 用于处理queryData返回结果，并取消进度条的显示.<br>
		 * 最终的数据结果处理将交由方法 {@link #onPostExecuteImpl(Object)}处理.
		 * </p>
		 * 
		 * @param dfs doInBackground里传递过来的就是从服务端返回的处理结果对象
		 * @see #onPostExecuteImpl(Object)
		 */
		@Override
		protected void onPostExecute(DataFromServer dfs) 
		{
			// 服务端数据成功返回
			if (dfs != null	&& HttpServiceFactory4A.isSuccess(dfs, activity))
			{
				Log.d(TAG, "--成功");
				//隐藏进度提示
				_hideProgessBar();
				
				//对从服务端取过来的数据进行解析
				ArrayList<Device> dtoFromServer = (ArrayList<Device>)dfs.getReturnValue();
				if(dtoFromServer != null)
				{
					goodsProvider.resetDatas(dtoFromServer);
					_dataLoadSucess();
				}
			} 
			else
			{
				Log.d(TAG, "--失败");
			}
		}
		
		protected abstract void _showProgessBar();
		protected abstract void _hideProgessBar();
		protected abstract void _dataLoadSucess();
	}

}
